home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / pc / ABUSESRC.ZIP / AbuseSrc / macabuse / src / net / mac / ddptst.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-05-20  |  9.3 KB  |  405 lines

  1. #include <AppleTalk.h>
  2. #include <ADSP.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <stdarg.h>
  6. #include <string.h>
  7.  
  8. DDPSocketListenerUPP DDPListener;
  9.  
  10. #ifdef __POWERPC__
  11. UniversalProcPtr InitDDPListener;
  12. #else
  13. extern asm void DDPEntry(char *buffer);
  14. #endif
  15.  
  16. #define PACKET_TYPE 0xaa
  17.  
  18. int eprintf(char *form, ...)
  19. {
  20.     va_list arg;
  21.     
  22.     va_start(arg,form);
  23.     vfprintf(stderr,form,arg);
  24.     va_end(arg);
  25.     
  26.     exit(0);
  27.  
  28.     return 0;
  29. }
  30.  
  31. #define assert(x,y) ((x)? 0 : eprintf("Line %d: %s, error\n",__LINE__, y))
  32. #define macerr(x,y) ((x)? eprintf("Line %d: %s, error %d\n",__LINE__, y, x) : 0)
  33.  
  34. unsigned char *pstrcpy(unsigned char *d, unsigned char *s)
  35. {
  36.     unsigned int i = (unsigned char)s[0];
  37.  
  38.     BlockMove(s,d,i+1);
  39.     
  40.     return d;
  41. }
  42.  
  43. struct sPacket
  44. {
  45.     long Count;
  46.     AddrBlock Addr;
  47.     long Data;
  48. };
  49. struct sDDPBuff
  50. {
  51.     struct sPacket *Start,*End,*Head,*Tail;
  52.     long Count;
  53.     long Data;
  54. };
  55.  
  56. NamesTableEntry    myNTEName;
  57. MPPParamBlock p;
  58. char buffer[602 + 20 + 602*16];
  59. ATDDPRec ddp;
  60.  
  61. unsigned char socket = 0;
  62. short    mppRef;
  63.  
  64. void DoWrite(AddrBlock addr,char *buff, short size)
  65. {
  66.     char wds[14];
  67.     char header[20];
  68.  
  69.     // the connection with the chosen socket is open, so now send to
  70.     //  the send queue exactly myDataSize number of bytes
  71.  
  72.     // set up WriteDDP parameters
  73.  
  74.     fprintf(stderr,"Writing Data\n");
  75.     
  76.     BuildDDPwds((Ptr)wds, (Ptr)header, (Ptr)buff, addr, PACKET_TYPE,size);
  77.  
  78.     p.DDP.ioCompletion = nil;
  79.     p.DDP.socket = socket;
  80.     p.DDP.checksumFlag = 0;
  81.     p.DDP.u.wdsPointer = (Ptr) &wds;
  82.  
  83.     macerr(PWriteDDP(&p, FALSE), "Write error");
  84.                                 // send data to the remote connection
  85. }
  86.  
  87. void DoRead(AddrBlock *addr, char *buff, short size)
  88. {
  89.     // Now read from the receive queue exactly myDataSize number of bytes.
  90.  
  91.     fprintf(stderr,"Reading Data\n");
  92.  
  93.     struct sDDPBuff *db = (struct sDDPBuff *)(&buffer[602]);
  94.     while ( db->Count == 0) ;
  95.     
  96.     db->Count--;
  97.  
  98.     struct sPacket *pk = db->Tail;
  99.     char *b = (char*)&pk->Data;
  100.  
  101.     for (int i=0; i<pk->Count && i<size;i++)
  102.         buff[i] = b[i];
  103.  
  104.     *addr = pk->Addr;
  105.  
  106.     pk = (struct sPacket *)((char *)pk + 602);
  107.     if (pk>=db->End)
  108.         pk = db->Start;
  109.     db->Tail = pk;
  110. }
  111.  
  112. int PickSocket(AddrBlock *addr)
  113. {
  114.     EntityName    entity;
  115.     char Buff[105];
  116.  
  117.     NBPSetEntity((Ptr) &entity, "\p=", "\pAbuseServer", "\p*");
  118.     
  119.     p.NBPinterval = 7;// retransmit every 7*8=56 ticks
  120.     p.NBPcount = 3;    // and retry 3 times
  121.     p.NBPentityPtr = (Ptr) &entity;
  122.     p.NBPretBuffPtr = (Ptr) Buff;
  123.     p.NBPretBuffSize = sizeof(Buff);
  124.     p.NBPmaxToGet = 1;
  125.  
  126.     macerr(PLookupName(&p,0), "Lookup error");
  127.     
  128.     if (p.NBPnumGotten != 1)
  129.         return 0;
  130.         
  131.     macerr(NBPExtract((Ptr)Buff,p.NBPnumGotten,1,&entity,addr),"Extraction error");
  132.  
  133.     for (int i=0; i<entity.objStr[0]; i++)
  134.         Buff[i] = entity.objStr[1+i];
  135.     Buff[entity.objStr[0]] = 0;
  136.     
  137.     fprintf(stderr,"Found [%s]\n",Buff);
  138.  
  139.     return 1;
  140. }
  141.  
  142. void main ()
  143. {
  144.     AddrBlock    myAddrBlk;
  145.  
  146.     fprintf(stderr,"Open MPP\n");
  147.     macerr(OpenDriver("\p.MPP", &mppRef), "MPP Open Error");    // open .MPP driver
  148.  
  149. #ifdef __POWERPC__
  150.     // Load 68K listener
  151.     printf("Loading 68K Resource\n");
  152.     Handle listener;
  153.  
  154.     listener = GetResource('SOCK',0);
  155.  
  156.     if (!listener)
  157.         return;
  158.  
  159.     HLock(listener);
  160.     InitDDPListener = (UniversalProcPtr)NewRoutineDescriptor((ProcPtr)(*listener + 0x12),
  161.         kRegisterBased
  162.          | REGISTER_ROUTINE_PARAMETER(1, kRegisterA1, SIZE_CODE(sizeof(long))),kM68kISA);
  163.     DDPListener = (UniversalProcPtr) (*listener+0x14);
  164. #else
  165.     DDPListener = (DDPSocketListenerUPP)(((char*)(&DDPEntry)) + 6);
  166. #endif
  167.  
  168.     struct sDDPBuff *db = (struct sDDPBuff *)(&buffer[602]);
  169.  
  170.     db->Start = (struct sPacket *)(&db->Data);
  171.     db->End = (struct sPacket *)(((char*)db->Start) + 602*16);
  172.     db->Tail = db->Head = db->Start;
  173.     db->Count = 0;
  174.  
  175.     // start DDP
  176.     fprintf(stderr,"Open DDP socket\n");
  177.     ddp.abResult = 1;
  178.     ddp.ddpActCount = 0;
  179.     ddp.ddpReqCount = 586;
  180.     ddp.ddpDataPtr = buffer;
  181.     p.MPPioCompletion = 0L;
  182.     p.MPPioRefNum = mppRef;
  183.     p.DDPsocket = 0;
  184.     p.DDPlistener = DDPListener;
  185.     macerr(POpenSkt(&p,FALSE), "Open Socket Error");
  186.     socket = p.DDPsocket;
  187.  
  188.     fprintf(stderr,"Initialize socket listener\n");
  189.  
  190. #ifdef __POWERPC__
  191.     CallUniversalProc(InitDDPListener, 
  192.                 kRegisterBased | 
  193.                 REGISTER_ROUTINE_PARAMETER(1, kRegisterA1, SIZE_CODE(sizeof(long))),
  194.             (char*)db);
  195. #else
  196.     DDPEntry((char*)db);
  197. #endif
  198.  
  199.     short node,net;
  200.     Str255 name;
  201.     
  202.     fprintf(stderr,"Get Address...");    
  203.     macerr(GetNodeAddress(&node,&net),"Can't get node address");
  204.     sprintf((char*)&name[1],"Abuse@%d:%d:%d",net,node,socket);
  205.     name[0] = strlen((char*)&name[1]);
  206.  
  207.     fprintf(stderr,"I'm %s\n",&name[1]);
  208.     
  209.     NBPSetNTE((Ptr) &myNTEName, "\pDDPtst", "\pAbuseServer", "\p*", socket);
  210.             // set up NBP names table entry
  211.  
  212.     // set up PRegisterName parameters
  213.  
  214.     fprintf(stderr,"Registering Name\n");
  215.  
  216.     p.NBP.interval = 7;                                                    // retransmit every 7*8=56 ticks
  217.     p.NBP.count = 3;                                                        // and retry 3 times
  218.     p.NBP.nbpPtrs.entityPtr = (Ptr) &myNTEName;    // name to register
  219.     p.NBP.parm.verifyFlag = 1;                                    // verify this name
  220.  
  221.     if (PRegisterName(&p, FALSE))
  222.     {
  223.         fprintf(stderr,"Couldn't register name\n");
  224.  
  225.         do
  226.         {
  227.             fprintf(stderr,"Searching for socket\n");
  228.         } while (!PickSocket(&myAddrBlk));
  229.  
  230.         fprintf(stderr,"Found %d:%d:%d\n",myAddrBlk.aNet,myAddrBlk.aNode,myAddrBlk.aSocket);
  231.  
  232.         char st[80];
  233.  
  234.         DoWrite(myAddrBlk,"Haoel, maestre!",16);
  235.         DoWrite(myAddrBlk,"Haoel, maestre!",16);
  236.         DoWrite(myAddrBlk,"Haoel, maestre!",16);
  237.         DoWrite(myAddrBlk,"Haoel, maestre!",16);
  238.         DoWrite(myAddrBlk,"Haoel, maestre!",16);
  239.         DoWrite(myAddrBlk,"Haoel, maestre!",16);
  240.         DoWrite(myAddrBlk,"Haoel, maestre!",16);
  241.         DoWrite(myAddrBlk,"Haoel, maestre!",16);
  242.         
  243.         DoRead(&myAddrBlk,st,sizeof(st));
  244.         fprintf(stderr,"Got [%s] from %d:%d:%d\n",st,
  245.             myAddrBlk.aNet,
  246.             myAddrBlk.aNode,
  247.             myAddrBlk.aSocket
  248.             );    
  249.         
  250.         DoWrite(myAddrBlk,"Haoel, maestre!",16);
  251.         DoWrite(myAddrBlk,"Haoel, maestre!",16);
  252.         DoWrite(myAddrBlk,"Haoel, maestre!",16);
  253.         DoWrite(myAddrBlk,"Haoel, maestre!",16);
  254.         DoWrite(myAddrBlk,"Haoel, maestre!",16);
  255.         DoWrite(myAddrBlk,"Haoel, maestre!",16);
  256.         DoWrite(myAddrBlk,"Haoel, maestre!",16);
  257.         DoWrite(myAddrBlk,"Haoel, maestre!",16);
  258.         DoWrite(myAddrBlk,"Haoel, maestre!",16);
  259.     }
  260.     else
  261.     {
  262.         char st[80];
  263.         
  264.         DoRead(&myAddrBlk,st,sizeof(st));
  265.         fprintf(stderr,"Got [%s] from %d:%d:%d\n",st,
  266.             myAddrBlk.aNet,
  267.             myAddrBlk.aNode,
  268.             myAddrBlk.aSocket
  269.             );
  270.  
  271.         DoRead(&myAddrBlk,st,sizeof(st));
  272.         fprintf(stderr,"Got [%s] from %d:%d:%d\n",st,
  273.             myAddrBlk.aNet,
  274.             myAddrBlk.aNode,
  275.             myAddrBlk.aSocket
  276.             );
  277.  
  278.         DoWrite(myAddrBlk,"Hello, other!",14);
  279.  
  280.         DoRead(&myAddrBlk,st,sizeof(st));
  281.         fprintf(stderr,"Got [%s] from %d:%d:%d\n",st,
  282.             myAddrBlk.aNet,
  283.             myAddrBlk.aNode,
  284.             myAddrBlk.aSocket
  285.             );
  286.  
  287.         DoRead(&myAddrBlk,st,sizeof(st));
  288.         fprintf(stderr,"Got [%s] from %d:%d:%d\n",st,
  289.             myAddrBlk.aNet,
  290.             myAddrBlk.aNode,
  291.             myAddrBlk.aSocket
  292.             );
  293.  
  294.         DoRead(&myAddrBlk,st,sizeof(st));
  295.         fprintf(stderr,"Got [%s] from %d:%d:%d\n",st,
  296.             myAddrBlk.aNet,
  297.             myAddrBlk.aNode,
  298.             myAddrBlk.aSocket
  299.             );
  300.  
  301.         DoRead(&myAddrBlk,st,sizeof(st));
  302.         fprintf(stderr,"Got [%s] from %d:%d:%d\n",st,
  303.             myAddrBlk.aNet,
  304.             myAddrBlk.aNode,
  305.             myAddrBlk.aSocket
  306.             );
  307.  
  308.         DoRead(&myAddrBlk,st,sizeof(st));
  309.         fprintf(stderr,"Got [%s] from %d:%d:%d\n",st,
  310.             myAddrBlk.aNet,
  311.             myAddrBlk.aNode,
  312.             myAddrBlk.aSocket
  313.             );
  314.  
  315.         DoRead(&myAddrBlk,st,sizeof(st));
  316.         fprintf(stderr,"Got [%s] from %d:%d:%d\n",st,
  317.             myAddrBlk.aNet,
  318.             myAddrBlk.aNode,
  319.             myAddrBlk.aSocket
  320.             );
  321.  
  322.         DoRead(&myAddrBlk,st,sizeof(st));
  323.         fprintf(stderr,"Got [%s] from %d:%d:%d\n",st,
  324.             myAddrBlk.aNet,
  325.             myAddrBlk.aNode,
  326.             myAddrBlk.aSocket
  327.             );
  328.  
  329.         DoRead(&myAddrBlk,st,sizeof(st));
  330.         fprintf(stderr,"Got [%s] from %d:%d:%d\n",st,
  331.             myAddrBlk.aNet,
  332.             myAddrBlk.aNode,
  333.             myAddrBlk.aSocket
  334.             );
  335.  
  336.         DoRead(&myAddrBlk,st,sizeof(st));
  337.         fprintf(stderr,"Got [%s] from %d:%d:%d\n",st,
  338.             myAddrBlk.aNet,
  339.             myAddrBlk.aNode,
  340.             myAddrBlk.aSocket
  341.             );
  342.  
  343.         DoRead(&myAddrBlk,st,sizeof(st));
  344.         fprintf(stderr,"Got [%s] from %d:%d:%d\n",st,
  345.             myAddrBlk.aNet,
  346.             myAddrBlk.aNode,
  347.             myAddrBlk.aSocket
  348.             );
  349.  
  350.         DoRead(&myAddrBlk,st,sizeof(st));
  351.         fprintf(stderr,"Got [%s] from %d:%d:%d\n",st,
  352.             myAddrBlk.aNet,
  353.             myAddrBlk.aNode,
  354.             myAddrBlk.aSocket
  355.             );
  356.  
  357.         DoRead(&myAddrBlk,st,sizeof(st));
  358.         fprintf(stderr,"Got [%s] from %d:%d:%d\n",st,
  359.             myAddrBlk.aNet,
  360.             myAddrBlk.aNode,
  361.             myAddrBlk.aSocket
  362.             );
  363.  
  364.         DoRead(&myAddrBlk,st,sizeof(st));
  365.         fprintf(stderr,"Got [%s] from %d:%d:%d\n",st,
  366.             myAddrBlk.aNet,
  367.             myAddrBlk.aNode,
  368.             myAddrBlk.aSocket
  369.             );
  370.  
  371.         DoRead(&myAddrBlk,st,sizeof(st));
  372.         fprintf(stderr,"Got [%s] from %d:%d:%d\n",st,
  373.             myAddrBlk.aNet,
  374.             myAddrBlk.aNode,
  375.             myAddrBlk.aSocket
  376.             );
  377.  
  378.         DoRead(&myAddrBlk,st,sizeof(st));
  379.         fprintf(stderr,"Got [%s] from %d:%d:%d\n",st,
  380.             myAddrBlk.aNet,
  381.             myAddrBlk.aNode,
  382.             myAddrBlk.aSocket
  383.             );
  384.  
  385.     }
  386.  
  387.     // we're done with the connection, so remove it
  388.  
  389.     fprintf(stderr,"Removing Connection\n");
  390.  
  391.     EntityName    entity;
  392.     
  393.     NBPSetEntity((Ptr) &entity, "\pDDPtst", "\pAbuseServer", "\p*");
  394.     p.MPPioCompletion = 0L;
  395.     p.MPPioRefNum = mppRef;
  396.     p.NBP.nbpPtrs.entityPtr = (Ptr)&entity;
  397.     macerr(PRemoveName(&p,FALSE),"Unregister name error");
  398.  
  399.     p.DDPsocket = socket;
  400.     macerr(PCloseSkt(&p,FALSE), "Error closing socket");
  401.  
  402.     fprintf(stderr,"Done.\n");
  403. }    // MyADSP
  404.  
  405.